package main

import (
	"fmt"
	"gin-demo/conf"
	"gin-demo/controller"
	"io"
	"net/http"
	"os"
	"time"

	"github.com/gin-gonic/gin"
)

func main() {
	// Engin
	// 创建记录日志的文件
	logfile, err := os.Create(conf.LOG_PATH + "gin-demo.log")
	if err != nil {
		println("Could not create log file")
	}
	gin.SetMode(gin.DebugMode)
	gin.DefaultWriter = io.MultiWriter(logfile, os.Stdout) // 如果需要将日志同时写入文件和控制台

	//router := gin.Default()
	router := gin.New() // 不包含中间件

	// 全局中间件
	//router.Use(gin.Logger())   // 使用 Logger 中间件
	router.Use(gin.Recovery()) // 使用 Recovery 中间件

	//自定义日志格式
	router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
		// 你的自定义格式
		return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",
			param.ClientIP,
			param.TimeStamp.Format(time.RFC1123),
			param.Method,
			param.Path,
			param.Request.Proto,
			param.StatusCode,
			param.Latency,
			param.Request.UserAgent(),
			param.ErrorMessage,
		)
	}))

	// 加载html文件，即template包下所有文件
	router.LoadHTMLGlob("template/*")
	//设置表态文件
	//router.Static("/assets", "./assets")
	//router.StaticFS("/more_static", http.Dir("my_file_system"))
	//router.StaticFile("/favicon.ico", "./resources/favicon.ico")

	//router.GET("/hello", hello)
	// 路由组
	user := router.Group("/user")
	{
		user.GET("/get/:id/:username", controller.QueryById) // 请求参数在请求路径上
		user.GET("/query", controller.QueryParam)
		user.POST("/insert", controller.InsertNewUser)
		user.GET("/form", controller.RenderForm) // 跳转html页面
		user.POST("/form/post", controller.PostForm)
		user.POST("/login", controller.Login)
		user.GET("/json", controller.JSON)
		user.GET("/purejson", controller.PureJSON)
		user.GET("/index", controller.Index)
		user.GET("/someDataFromReader", func(c *gin.Context) { //返回第三方获取的数据
			response, err := http.Get("https://raw.githubusercontent.com/gin-gonic/logo/master/color.png")
			if err != nil || response.StatusCode != http.StatusOK {
				c.Status(http.StatusServiceUnavailable)
				return
			}
			reader := response.Body
			contentLength := response.ContentLength
			contentType := response.Header.Get("Content-Type")

			extraHeaders := map[string]string{
				"Content-Disposition": `attachment; filename="gopher.png"`,
			}
			c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders)
		})
		// user.GET("/someProtoBuf", func(c *gin.Context) {
		// 	reps := []int64{int64(1), int64(2)}
		// 	label := "test"
		// 	data := &protoexample.Test{
		// 		Label: &label,
		// 		Reps:  reps,
		// 	}
		// 	c.ProtoBuf(http.StatusOK, data)
		// })

		//c.JSONP(http.StatusOK, data) // 跨域传输
	}

	file := router.Group("/file")
	{
		// 跳转上传文件页面
		//file.GET("/view", controller.RenderView) // 跳转html页面
		// 根据表单上传
		file.POST("/singleUpload", controller.FormUpload)
		file.POST("/multiUpload", controller.MultiUpload)
		// base64上传
		file.POST("/upload", controller.Base64Upload)
	}

	// 指定地址和端口号
	router.Run(":8080")
}
